/*
 * entradasDeDirectorio.c
 *
 *  Created on: 27/09/2011
 *      Author: utn_so
 */


#include <fuse.h>
#include <errno.h>
#include <fcntl.h>

#include <stdio.h>
#include <string.h>
#include "directorio.h"
#include "utils.h"

int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
                         off_t offset, struct fuse_file_info *fi)
{

    (void) offset;
    (void) fi;
    ENTRADA83 *entrada;

    FILE *archivoPrueba;
    archivoPrueba = fopen("/home/utn_so/directorio","r+b" );

    entrada = malloc(sizeof(ENTRADA83));

    filler(buf, ".", NULL, 0);
    filler(buf, "..", NULL, 0);

    while (feof(archivoPrueba) == 0)
    {
    	if(fread(entrada, sizeof(ENTRADA83), 1, archivoPrueba) != 1)
    	{
    		printf("ERROR AL LEER LA SIGUIENTE ENTRADA DE DIRECTORIO");
    		return 0;
    	}

    	if (entrada->atributos != ATR_NOM_LARGO)
    	{
    		char nombre[12 + 1];
    		armar_nombre_corto(entrada->nombre, nombre);
    		printf("%s\n",nombre);
    		filler(buf, nombre , NULL, 0);
    	}

    	else
    	{
    		char nombre[13 + 1];

    		armar_parte_de_nombre((ENTRADA_LARGA*) entrada, nombre);
    		printf("%s\n",nombre);
    		filler(buf, nombre, NULL, 0);

    	}
    }

    return 0;
}




int armar_nombre_corto(const char * elemento, char * nombre){

	char extension[3+1];

	nombre[8] = extension[3] = '\0';
	strncpy(extension, elemento + 8, 3);
	strncpy(nombre, elemento, 8);
	strcat(nombre, ".");
	strcat(nombre, extension);

	return 0;
}

int armar_parte_de_nombre(const ENTRADA_LARGA *entrada, char *destino){

	char los5[5 + 1];
	char los6[6 + 1];
	char los2[2 + 1];
	los5[5] = los6[6] = los2[2] = '\0';
	unsigned int dos = 2, cinco = 5, seis = 6;

	if (1 != unicode_utf16_to_utf8_inbuffer((uint16_t *)entrada->cinco_caracteres, cinco , los5, &cinco))
	{
		perror("NO SE PUEDE CONSTRUIR EL NOMBRE LARGO A PARTIR DE LA ENTRADA LARGA CON EL PRIMER ELEMENTO");
		return 1;
	}
	printf("%s\n",los5);

	if (1 != unicode_utf16_to_utf8_inbuffer(entrada->seis_caracteres, seis, los6, &seis))
	{
		perror("NO SE PUEDE CONSTRUIR EL NOMBRE LARGO A PARTIR DE LA ENTRADA LARGA CON EL SEGUNDO ELEMENTO");
		return 1;
	}
	printf("%s\n",los6);

	if (1 != unicode_utf16_to_utf8_inbuffer(entrada->dos_caracteres, dos, los2, &dos))
	{
		perror("NO SE PUEDE CONSTRUIR EL NOMBRE LARGO A PARTIR DE LA ENTRADA LARGA CON EL TERCER ELEMENTO");
		return 1;
	}
	printf("%s\n",los2);

	*destino = '\0';
	strcat(destino, los5);
	strcat(destino, los6);
	strcat(destino, los2);

	return 0;

}







/*
int main(void)
{
	return 0;
}
*/







/*----------------------------------------------------------------------------*
 * 																			  *
 * EL SIGUIENTE CODIGO FUE ESCRITO CON LA IDEA DE ARMAR NOMBRES LARGOS DE UNA *
 * CANTIDAD NO DETERMINADA DE ENTRADAS DE NOMBRE LARGO:						  *
 * 																			  *
 * 																			  *
 *----------------------------------------------------------------------------*

/*Esta funcion arma un nombre suponiendo que no se ha
 * llegado al fin de archivo ni hay errores en el archivo de directorio* /
struct ENTRADA_ESTANDAR83 *armar_nombre(char *buffer, struct ENTRADA_ESTANDAR83 *entrada){

	int es_nombre_largo = NOM_83;
	char parte_de_nombre[13 + 1];
	char nombre[256] = {};

	/*Verificar si la entrada es nobre largo* /
	if (entrada->atributos == ATR_NOM_LARGO)
		es_nombre_largo = NOM_LARGO;

	/*Armar el nombre* /
	if(!es_nombre_largo)
		strcpy(nombre, armar_nombre_corto(entrada->nombre));
	else
		do{
			armar_parte_de_nombre((struct ENTRADA_LARGA *) entrada, parte_de_nombre);
			strcat(nombre, parte_de_nombre);//se va armando el nombre largo
			entrada = entrada + 1;//se incrementa el puntero de la entrada


		}while((entrada->atributos != ATR_NOM_LARGO) /*&& (!feof(directorio)* /);

	//Comprobar Errores
	if (entrada->atributos != DIRECTORY || entrada->atributos != ARCHIVE){
		perror("%s%s%s","LOS ATRIBUTOS DEL ARCHIVO, ",nombre, "NO CORRESPONDEN A UN ATRIBUTO UTILIZADO POR EL FYLE SYSTEM EN USO");
		return EXIT_FAILURE;
	}

	strcpy(buffer, nombre);

	return entrada;
}
*/


